package com.ywj.volatilePrac;

import java.util.ArrayList;
import java.util.List;

/**
 * 目标：演示原子性问题
 * 1.定义一个共享变量number
 * 2.对number进行1000的++操作
 * 3.使用5个线程来进行
 */
public class Test02Atomicity {
    private volatile static int number = 0;

    public static void main(String[] args) throws InterruptedException {
        Runnable increment = () -> {
            for (int i = 0; i < 1000; i++) {
                number++;
            }
        };

        List<Thread> list = new ArrayList<>();
        //使用5个线程来进行
        for (int i = 0; i < 5; i++) {
            Thread t = new Thread(increment);
            t.start();
            list.add(t);
        }

        for (Thread thread : list) {
            //让主线程等待自己创建的线程执行完毕，5个线程执行完 再取number的值
            thread.join();
        }

        System.out.println("number=" + number);  //值有多种可能，2677、4202、4722、4910、5000


    }
}


////使用Lock
//public class Test02Atomicity {
//    private static int number = 0;
//    private static Lock lock = new ReentrantLock();
//
//    public static void main(String[] args) throws InterruptedException {
//        Runnable increment = () -> {
//            for (int i = 0; i < 1000; i++) {
//
//                try {
//                    lock.lock();
//                    number++;
//                } finally {
//                    lock.unlock();
//                }
//
//            }
//        };
//
//        List<Thread> list = new ArrayList<>();
//        //使用5个线程来进行
//        for (int i = 0; i < 5; i++) {
//            Thread t = new Thread(increment);
//            t.start();
//            list.add(t);
//        }
//        for (Thread thread : list) {
//            //让主线程等待自己创建的线程执行完毕，5个线程执行完 再取number的值
//            thread.join();
//        }
//
//        System.out.println("number=" + number);  //值有多种可能，2677、4202、4722、4910、5000
//
//
//    }
//}

//使用java并发包中的原子操作类
//public class Test02Atomicity {
//    private static AtomicInteger atomicInteger = new AtomicInteger();
//
//    public static void main(String[] args) throws InterruptedException {
//        Runnable increment = () -> {
//            for (int i = 0; i < 1000; i++) {
//                atomicInteger.incrementAndGet();   //AtomicInteger的incrementAndGet()可保证变量赋值的原子性
//            }
//        };
//
//        List<Thread> list = new ArrayList<>();
//        for (int i = 0; i < 5; i++) {
//            Thread t = new Thread(increment);
//            t.start();
//            list.add(t);
//        }
//
//        for (Thread thread : list) {
//            //让主线程等待自己创建的线程执行完毕
//            thread.join();
//        }
//
//        System.out.println("atomicInteger=" + atomicInteger.get());  //5000
//
//    }
//}
